/**
 * Copyright 2006 gworks.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 */
package org.javaongems.client.winctrls;

import java.util.ArrayList;

import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;

/**
 * <p>Provides an iconic representation of the listview for non-detailed usage.</p>
 * 
 * @author Ashin Wimalajeewa (ash)
 */
public class ListViewIconView extends FlowPanel implements ListViewDataSourceView {
		final ListView container;

		public ListViewIconView(ListView view) {
		    container = view;
			sinkEvents(Event.ONCLICK | Event.ONDBLCLICK);
			setStyleName(getElement(), "gems-IconView", true);
		}
		
		public void onBrowserEvent(Event event) {
			switch (DOM.eventGetType(event)) {
				case Event.ONCLICK: {
					container.lastEvent = event;
					int[] rowPos = new int[1];
					ListViewIconItem hit = findIcon(DOM.eventGetTarget(event), rowPos);
					if (hit == null)
						return;
					int rowId = hit.row;
					container.handleDataRowSelection(rowId, rowPos[0]);
		    		if (container.eventHandler != null) {
		    			container.eventHandler.onClick(container, rowId, -1);
		    		}
		            DOM.eventCancelBubble(event, true);
		            break;
				}
		      case Event.ONDBLCLICK: {
		    		if (container.eventHandler != null) {
						int[] rowPos = new int[1];
						ListViewIconItem hit = findIcon(DOM.eventGetTarget(event), rowPos);
		    		    container.eventHandler.onDblClick(container, hit.row, -1);
		    		}
		    		break;
		      }
			}
		}
		    
		public Widget toWidget() {
			return this;
		}

		public void render() {
			this.clear();
			int rowSz = (container.source == null ? 0: container.source.getDataRowCount());
			container.prepareSortMappers(rowSz);
			container.sortData(rowSz);
			renderData(rowSz);
			renderSelections();
		}
		
		private ListViewIconItem findIcon(Element eventElm, int[] posStore) {
			int sz = getWidgetCount();
			for (int i = 0; i < sz; ++i) {
				ListViewIconItem icon = (ListViewIconItem) getWidget(i);
				if (DOM.isOrHasChild(icon.getElement(), eventElm)) {
					posStore[0] = i;
					return icon;
				}
			}
			return null;
		}

		private void renderData(int sz) {
			for (int i = 0; i < sz; i++) {
				int dataRowId = container.sortedRows[i];
				ListViewIconItem elem = new ListViewIconItem(this, dataRowId);
				add(elem);
				elem.render();
			}
		}
		
		public void renderSelections() {
			renderSelection(container.deSelectedIds, false);
			renderSelection(container.selectedIds, true);
		}
		
		private void renderSelection(ArrayList list, boolean select) {
			int sz = list.size();
			for (int i = 0; i < sz; i++) {
				Integer dataRow = (Integer) list.get(i);
				Widget w = getWidget(container.dataSrcRows[dataRow.intValue()]);
				String clz = "selected";
				UIObject.setStyleName(w.getElement(), clz, select);
			}
		}
	}